/**
 * 用户状态管理 Store
 * 负责管理用户登录状态、权限信息和菜单数据
 * 使用 sessionStorage 进行状态持久化
 */

import { defineStore } from "pinia";
import { loginApi } from "@/api/user";

/**
 * 登录接口参数类型定义
 */
interface LoginParams {
  username: string; // 用户名
  password: string; // 密码
}

/**
 * 用户登录响应数据结构
 */
interface LoginResponse {
  token: string; // 认证令牌
  user: {
    username: string; // 用户名
    roles: string[]; // 用户角色数组
  };
  menulist: any[]; // 菜单列表
}

/**
 * 用户状态管理 Store
 * 管理用户登录状态、角色权限和菜单信息
 */
export const useUserStore = defineStore("user", {
  /**
   * 状态定义
   * 从 sessionStorage 初始化，确保刷新后状态不丢失
   */
  state: () => ({
    // 用户认证令牌
    token: sessionStorage.getItem("token") || "",

    // 用户角色权限列表
    roles: sessionStorage.getItem("roles")
      ? JSON.parse(sessionStorage.getItem("roles") || "")
      : [],

    // 当前登录用户名
    username: sessionStorage.getItem("username") || "",

    // 用户菜单权限列表
    menu: sessionStorage.getItem("menu")
      ? JSON.parse(sessionStorage.getItem("menu") || "")
      : [],
  }),

  /**
   * 动作方法定义
   * 处理用户登录、退出等业务逻辑
   */
  actions: {
    /**
     * 用户登录方法
     * @param data - 登录参数，包含用户名和密码
     * @throws 抛出登录过程中的错误
     */
    async login(data: LoginParams) {
      try {
        // 调用登录接口
        const {
          data: {
            token,
            user: { username, roles },
            menulist,
          },
        } = await loginApi(data);

        // 批量更新 Store 状态，减少响应式更新次数
        this.$patch({
          token,
          username,
          roles,
          menu: menulist,
        });

        // 统一处理 sessionStorage 存储，确保数据一致性
        const storageMap = [
          ["token", token],
          ["username", username],
          ["roles", JSON.stringify(roles)],
          ["menu", JSON.stringify(menulist)],
        ];

        storageMap.forEach(([key, value]) => {
          sessionStorage.setItem(key, value);
        });
      } catch (error) {
        // 向上抛出错误，由调用方处理
        throw error;
      }
    },

    /**
     * 用户退出登录方法
     * 清空本地状态和 sessionStorage
     */
    logout() {
      // 清空 Store 状态
      this.token = "";
      this.roles = [];
      this.username = "";
      this.menu = [];

      // 清空 sessionStorage
      sessionStorage.clear();
    },
  },
});
